#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Excel导出功能测试脚本
测试新的覆盖和历史备份机制
"""

import os
import shutil
from datetime import datetime
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side

def test_excel_export():
    """测试Excel导出功能"""
    
    # 测试数据
    test_data = [
        {
            "日期": "2024/12/19",
            "客户名称": "测试客户A",
            "订单号": "T001",
            "订单金额": 10000,
            "已付金额": 5000
        },
        {
            "日期": "2024/12/18",
            "客户名称": "测试客户B", 
            "订单号": "T002",
            "订单金额": 20000,
            "已付金额": 15000
        }
    ]
    
    # 固定的Excel文件名
    excel_filename = "应收账款统计表.xlsx"
    history_folder = "历史表格"
    
    print("🧪 开始Excel导出功能测试...")
    print("=" * 50)
    
    # 第一次导出测试
    print("📋 [测试1] 首次导出...")
    export_test_excel(test_data, excel_filename, history_folder)
    
    if os.path.exists(excel_filename):
        print("✅ 首次导出成功")
        print(f"📄 文件大小: {os.path.getsize(excel_filename)} 字节")
    else:
        print("❌ 首次导出失败")
        return
    
    # 等待1秒确保时间戳不同
    import time
    time.sleep(1)
    
    # 第二次导出测试（应该备份旧文件）
    print("\n📋 [测试2] 覆盖导出（应备份旧文件）...")
    
    # 修改测试数据
    test_data.append({
        "日期": "2024/12/17",
        "客户名称": "测试客户C",
        "订单号": "T003", 
        "订单金额": 30000,
        "已付金额": 25000
    })
    
    export_test_excel(test_data, excel_filename, history_folder)
    
    # 检查历史文件夹
    if os.path.exists(history_folder):
        history_files = [f for f in os.listdir(history_folder) if f.endswith('.xlsx')]
        print(f"✅ 历史文件夹存在，包含 {len(history_files)} 个文件")
        for f in history_files:
            print(f"  📄 {f}")
    else:
        print("❌ 历史文件夹不存在")
    
    # 第三次导出测试
    time.sleep(1)
    print("\n📋 [测试3] 再次覆盖导出...")
    
    test_data[0]["已付金额"] = 8000  # 修改数据
    export_test_excel(test_data, excel_filename, history_folder)
    
    # 最终检查
    if os.path.exists(history_folder):
        history_files = [f for f in os.listdir(history_folder) if f.endswith('.xlsx')]
        print(f"✅ 最终历史文件数量: {len(history_files)}")
    
    print("\n🎉 测试完成!")
    print("=" * 50)
    print("📊 测试结果总结:")
    print(f"✅ 当前Excel文件: {excel_filename} ({'存在' if os.path.exists(excel_filename) else '不存在'})")
    print(f"✅ 历史文件夹: {history_folder} ({'存在' if os.path.exists(history_folder) else '不存在'})")
    
    if os.path.exists(history_folder):
        history_files = [f for f in os.listdir(history_folder) if f.endswith('.xlsx')]
        print(f"✅ 历史文件数量: {len(history_files)}")
    
    # 询问是否清理测试文件
    cleanup = input("\n是否清理测试文件? (y/N): ").lower()
    if cleanup == 'y':
        if os.path.exists(excel_filename):
            os.remove(excel_filename)
            print(f"🗑️ 已删除 {excel_filename}")
        
        if os.path.exists(history_folder):
            shutil.rmtree(history_folder)
            print(f"🗑️ 已删除 {history_folder}")
        
        print("✅ 清理完成")
    else:
        print("💾 测试文件已保留，您可以查看导出效果")

def export_test_excel(data_list, excel_filename, history_folder):
    """导出测试Excel文件"""
    try:
        # 如果Excel文件已存在，先备份到历史文件夹
        if os.path.exists(excel_filename):
            # 创建历史文件夹（如果不存在）
            if not os.path.exists(history_folder):
                os.makedirs(history_folder)
                print(f"📁 创建历史文件夹: {history_folder}")
            
            # 生成历史文件名（带时间戳）
            timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
            history_filename = f"应收账款统计表_{timestamp}.xlsx"
            history_path = os.path.join(history_folder, history_filename)
            
            # 移动现有文件到历史文件夹
            shutil.move(excel_filename, history_path)
            print(f"📦 已备份旧文件到: {history_filename}")
        
        # 创建工作簿
        wb = Workbook()
        ws = wb.active
        ws.title = "应收账款统计表"
        
        # 设置样式
        header_font = Font(name="Microsoft YaHei", size=12, bold=True, color="FFFFFF")
        header_fill = PatternFill(start_color="2563EB", end_color="2563EB", fill_type="solid")
        data_font = Font(name="Microsoft YaHei", size=10)
        border = Border(
            left=Side(style='thin'),
            right=Side(style='thin'), 
            top=Side(style='thin'),
            bottom=Side(style='thin')
        )
        
        # 主数据区域 (A-G列)
        headers = ["序号", "日期", "客户名称", "订单号", "订单金额", "已付金额", "未付金额"]
        
        # 写入标题
        for col, header in enumerate(headers, 1):
            cell = ws.cell(row=1, column=col, value=header)
            cell.font = header_font
            cell.fill = header_fill
            cell.alignment = Alignment(horizontal="center", vertical="center")
            cell.border = border
        
        # 写入数据
        for row_idx, row_data in enumerate(data_list, 2):
            ws.cell(row=row_idx, column=1, value=row_idx-1)  # 序号
            ws.cell(row=row_idx, column=2, value=row_data["日期"])
            ws.cell(row=row_idx, column=3, value=row_data["客户名称"])
            ws.cell(row=row_idx, column=4, value=row_data["订单号"])
            ws.cell(row=row_idx, column=5, value=row_data["订单金额"])
            ws.cell(row=row_idx, column=6, value=row_data["已付金额"])
            
            # 未付金额公式
            ws.cell(row=row_idx, column=7, value=f"=E{row_idx}-F{row_idx}")
            
            # 设置边框和格式
            for col in range(1, 8):
                cell = ws.cell(row=row_idx, column=col)
                cell.border = border
                if col in [5, 6, 7]:  # 金额列
                    cell.number_format = '¥#,##0'
        
        # 汇总统计区域
        summary_row = 2
        ws.cell(row=summary_row, column=9, value="订单总额：")
        ws.cell(row=summary_row, column=10, value=f"=SUM(E2:E{len(data_list) + 1})").number_format = '¥#,##0'
        
        ws.cell(row=summary_row + 1, column=9, value="已付总额：")
        ws.cell(row=summary_row + 1, column=10, value=f"=SUM(F2:F{len(data_list) + 1})").number_format = '¥#,##0'
        
        ws.cell(row=summary_row + 2, column=9, value="未付总额：")
        ws.cell(row=summary_row + 2, column=10, value=f"=SUM(G2:G{len(data_list) + 1})").number_format = '¥#,##0'
        
        # 设置列宽
        column_widths = [8, 12, 15, 15, 15, 15, 15, 3, 12, 15]
        for i, width in enumerate(column_widths, 1):
            ws.column_dimensions[ws.cell(row=1, column=i).column_letter].width = width
        
        # 保存文件
        wb.save(excel_filename)
        print(f"💾 已保存新文件: {excel_filename} (数据行数: {len(data_list)})")
        
    except Exception as e:
        print(f"❌ 导出失败: {str(e)}")

if __name__ == "__main__":
    test_excel_export()
